// 泛型接口--在定义接口时, 为接口中的属性或方法定义泛型类型在使用接口时, 再指定具体的泛型类型
(() => {
  // 需求：定义一个类，用来存储用户的相关信息（id，名字，年龄）
  // 通过一个类的实例对象调用add方法可以添加多个用户信息对象，调用getById方法可以根据id获取某个指定的用户信息对象
  interface IbaseCRUD<T> {
    data: T[];
    add: (t: T) => void;
    getById: (id: number) => T;
  }
  //   定义一个用户信息类
  class User {
    id?: number; //id主键自增
    name: string; //姓名
    age: number; //年龄

    constructor(name, age) {
      this.name = name;
      this.age = age;
    }
  }
  // 定义一个类，可以针对用户的信息对象进行增加及查询操作
  class UserCRUD implements IbaseCRUD<User> {
    data: User[] = [];

    add(user: User): void {
      user = { ...user, id: Date.now() };
      this.data.push(user);
      console.log("保存user", user.id);
    }

    getById(id: number): User {
      return this.data.find((item) => item.id === id);
    }
  }

  const userCRUD = new UserCRUD();
  userCRUD.add(new User("tom", 12));
  userCRUD.add(new User("tom2", 13));
  console.log(userCRUD.data);
})();
